/**
 * Clase encargada de coordinar el procesamiento de las paginas (WebCrawler)
 * 
 * @author HPCIII_Team2013
 */

package cl.ucn.hpc.hpcearch;

import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.LinkedBlockingQueue;

import cl.ucn.hpc.direccion.Direction;
import cl.ucn.hpc.webCrawler.PoolSpider;

public class HPCearch extends Thread {
	private boolean running = true;
	private String path;
	private String urlInicial;
	
	/**
	 * Constructor de la clase
	 * 
	 * @param filepath Direccion donde se ha de almacenar la informacion encontrada
	 * @param link Pagina con la que se iniciara el WebCrawler
	 */
	public HPCearch(String filepath, String link){		
		path = filepath;
		urlInicial = link;
	}
	
	/**
	 * Inicia y mantiene activo el WebCrawler.
	 * Envia las paginas que se necesitan procesar y revisa que los nuevos links encontrados no esten repetidos.
	 */
	public void run() {
		PoolSpider pool = new PoolSpider(path);
		new Thread(pool).start();
	
		Direction direccion = Direction.getInstance();
		Set<String> linksTotales = new HashSet<String>();
		LinkedBlockingQueue<String>linksNuevos = direccion.getLinksSinRevisar();
				
		linksTotales.add(urlInicial);
		direccion.agregarLinkPendiente(urlInicial);
		
		while(running){
			String url = null;
			try {
				if (running == false && linksTotales.isEmpty()) {
					return;
				}
				
				url = linksNuevos.take();
				if(linksTotales.add(url)){
					direccion.agregarLinkPendiente(url);					
				}				
			}			
			catch (InterruptedException e) {
				e.printStackTrace();
			}			
		}		
	}
		
}
